#include <iostream>
#include "StdMyString.h"

int main()
{
#if 0
    // 标准库，给空字符串的空间大小
    std::string s;
    std::cout<<s.capacity()<<std::endl;
#endif

#if 0
    // 字符串赋值
    // 定义对象的时候进行赋值，称为初始化，用来构建对象，它调的一定是构造函数
    // 至于是哪种构造函数，就看它右边的值是左值还是右值，如果是右值，它就是带参，如果是左值，它就是拷贝
    StdMyString s = "hello world";  // 带参构造
    // StdMyString s = StdMyString("hello world");  // 带参构造（匿名对象，没有拷贝）
    // StdMyString s(StdMyString("hello world"));   // 带参构造
    // StdMyString s1 = s; // 拷贝构造（s是左值，一定是拷贝）
    // StdMyString s1(s);  // 拷贝构造
    StdMyString s1, s2; // 无参构造
    s2 = s1 = s; // 赋值运算符重载
    std::cout<<s<<std::endl;
#endif

#if 0
    // 字符串 +=
    StdMyString s = "world";
    StdMyString s1 = "hello";
    StdMyString s2;
    s2 += s1 += s;
    std::cout<<s2<<std::endl;
#endif

#if 0
    // 字符串 +
    StdMyString s1 = "world";
    StdMyString s2 = "hello";
    std::cout<<(s1 + s2)<<std::endl;
#endif

#if 0
    // 字符串 -=
    StdMyString s1 = "helloworld,helloworld";
    StdMyString s2 = "world";
    s1 -= s2;
    std::cout<<s1<<std::endl;
#endif

#if 0
    // 字符串 -
    StdMyString s1 = "helloworld,helloworld";
    StdMyString s2 = "world";
    std::cout<<(s1 - s2)<<std::endl;
#endif

#if 0
    // 重载 []（修改字符串的第一个字符）
    StdMyString s1 = "helloworld";
    StdMyString s2 = "world";
    s1[0] = 'p';
    std::cout<<s1<<std::endl;
#endif

#if 0
    // 重载 == > <
    StdMyString s1 = "zorld";
    StdMyString s2 = "world";
    std::cout<<(s1 > s2)<<std::endl;
#endif

#if 0
    // 重载 &&
    // 但是自己重载的&&有个问题：不遵循短路原则，很危险
    StdMyString s1;
    StdMyString s2 = "hello";
    if(s1 && (s2 += "world"))
    {
        std::cout<<"都不为空\n";
    }
    else
    {
        std::cout<<"至少有一个为空\n";
    }
    std::cout<<"s1 : "<<s1<<std::endl;
    std::cout<<"s2 : "<<s2<<std::endl;
#endif

#if 0
    // 正常的&&运算，遵循短路原则
    int a = 0;
    int b = 1;
    if(a && (b += 1))
    {

    }
    std::cout<<"a : "<<a<<std::endl;
    std::cout<<"b : "<<b<<std::endl;
#endif

#if 0
    // 输入运算符重载
    StdMyString s;
    std::cin>>s;
    std::cout<<s<<std::endl;
#endif

#if 0
    // 强制类型转换重载（字符串转整型）
    StdMyString s = "12345";
    int a = s + 1;
    std::cout<<a<<std::endl;
#endif

#if 0
    // 强制类型转换重载（字符串转浮点型）
    StdMyString s = "3.14";
    double a = (double)s + 1;
    std::cout<<a<<std::endl;
#endif

#if 0
    // 字符串切割
    StdMyString s = "zhangsan,lisi,wangwu";
    MyStringList list = s.split(",");
    std::cout<<list;
#endif

#if 0
    // 重载连续输出
    MyStringList list;
    // 往一个字符串数组里插入多个字符串
    list<<"zhangsan"<<"lisi"<<"wangwu"<<"sdujshdfkb";
    std::cout<<list;
#endif

#if 1
    MyStringList list1;
    list1<<"zhangsan"<<"lisi";
    MyStringList list2;
    list2<<"wangwu"<<"asdkjbdiwb";
    std::cout<<(list1 + list2);
#endif

    return 0;
}